#! /your/favourite/path/to/ruby
# -*- coding: utf-8 -*-

# Copyright (c) 2014 Urabe, Shyouhei.  All rights reserved.
#
# Redistribution  and  use  in  source   and  binary  forms,  with  or  without
# modification, are  permitted provided that the following  conditions are met:
#
#     - Redistributions  of source  code must  retain the  above copyright
#       notice, this list of conditions and the following disclaimer.
#
#     - Redistributions in binary form  must reproduce the above copyright
#       notice, this  list of conditions  and the following  disclaimer in
#       the  documentation  and/or   other  materials  provided  with  the
#       distribution.
#
#     - Neither the name of Internet  Society, IETF or IETF Trust, nor the
#       names of specific contributors, may  be used to endorse or promote
#       products derived from this software without specific prior written
#       permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS”
# AND ANY  EXPRESS OR  IMPLIED WARRANTIES, INCLUDING,  BUT NOT LIMITED  TO, THE
# IMPLIED WARRANTIES  OF MERCHANTABILITY AND  FITNESS FOR A  PARTICULAR PURPOSE
# ARE  DISCLAIMED. IN NO  EVENT SHALL  THE COPYRIGHT  OWNER OR  CONTRIBUTORS BE
# LIABLE  FOR   ANY  DIRECT,  INDIRECT,  INCIDENTAL,   SPECIAL,  EXEMPLARY,  OR
# CONSEQUENTIAL  DAMAGES  (INCLUDING,  BUT   NOT  LIMITED  TO,  PROCUREMENT  OF
# SUBSTITUTE  GOODS OR SERVICES;  LOSS OF  USE, DATA,  OR PROFITS;  OR BUSINESS
# INTERRUPTION)  HOWEVER CAUSED  AND ON  ANY  THEORY OF  LIABILITY, WHETHER  IN
# CONTRACT,  STRICT  LIABILITY, OR  TORT  (INCLUDING  NEGLIGENCE OR  OTHERWISE)
# ARISING IN ANY  WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF  ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# @abstract
# The Values, as described in RFC7159 section 3.
#
# >   value = false / null / true / object / array / number / string
class RFC7159::Value

	# Parse the AST from parser, and convert into corrsponding values.
	# @param  [::Array] ast    the AST, generated by the parser
	# @return [Value]          evaluated instance
	# @raise  [ArgumentError]  malformed input
	#
	# @note the input MUST be a  tree.  No cyclic lists, nor even direct-acycric
	#   graphs  are  allowed by  definition.   Such  input can  cause  undefined
	#   behaviour.
	def self.from_ast ast
		klass = case ast.first
				  when :false  then RFC7159::False
				  when :null   then RFC7159::Null
				  when :true   then RFC7159::True
				  when :object then RFC7159::Object
				  when :array  then RFC7159::Array
				  when :number then RFC7159::Number
				  when :string then RFC7159::String
				  end
		return klass.from_ast ast
	end

	# convert to Ruby's value
	def plain_old_ruby_object
		raise RuntimeError, 'abstruct method called'
	end

	# @return [::String] the class in string
	def inspect
		sprintf "#<%p>", self.class
	end

	# For pretty print (require 'pp' beforehand)
	# @param [PP] pp the pp
	def pretty_print pp
		pp.object_group self do end # nothing
	end
end

# *WARN* order matters, do not move below.
require_relative 'false'
require_relative 'null'
require_relative 'true'
require_relative 'object'
require_relative 'array'
require_relative 'number'
require_relative 'string'

# 
# Local Variables:
# mode: ruby
# coding: utf-8-unix
# indent-tabs-mode: t
# tab-width: 3
# ruby-indent-level: 3
# fill-column: 79
# default-justification: full
# End:
